# 代码3-25
import jieba
import jieba.posseg
# import numpy as np
# import pandas as pd
import math
import operator  
'''
提供Python内置的部分操作符函数，这里主要应用于序列操作
用于对大型语料库进行主题建模，支持TF-IDF、LSA和LDA等多种主题模型算法，提供了
诸如相似度计算、信息检索等一些常用任务的API接口
'''
# from gensim import corpora, models
text = '''嫦娥五号实现我国首次地外天体起飞
科技日报北京12月3日电 （李晨 记者付毅飞）记者从国家航天局获悉，12月3日23时10分，嫦娥五号上升器3000牛发动机工作约6分钟，成功将携带样品的上升器送入到预定环月轨道。这是我国首次实现地外天体起飞。
与地面起飞不同，嫦娥五号上升器月面起飞不具备成熟的发射塔架系统，着陆器相当于上升器的“临时塔架”，上升器起飞存在起飞初始基准与起飞平台姿态不确定、发动机羽流导流空间受限、地月环境差异等问题。另外由于月球上没有导航星座，上升器起飞后，需在地面测控辅助下，借助自身携带的特殊敏感器实现自主定位、定姿。
点火起飞前，着上组合体实现月面国旗展开以及上升器、着陆器的解锁分离。此次国旗展开是我国在月球表面首次实现国旗的“独立展示”。点火起飞后，上升器经历垂直上升、姿态调整和轨道射入三个阶段，进入预定环月飞行轨道。随后，上升器将与环月等待的轨返组合体交会对接，将月球样品转移到返回器，后者将等待合适的月地入射窗口，做好返回地球的准备。'''


# 代码3-26
# 获取停用词
def  Stop_words():
    stopword = []
    data = []
    f = open('./data/stopword.txt', encoding='utf8')
    for line in f.readlines():
        data.append(line)
    for i in data:
        output = i.replace('\n', '')
        stopword.append(output)
    return stopword

# 采用jieba进行词性标注，对当前文档过滤词性和停用词
def  Filter_word(text):
    filter_word = []
    stopword = Stop_words()
    text = jieba.posseg.cut(text)
    for word, flag in text:
        if flag.startswith('n') is False:
            continue
        if not word in stopword and len(word) > 1:
            filter_word.append(word)
    return filter_word


# 加载文档集，对文档集过滤词性和停用词
def  Filter_words(data_path = './data/news.txt'):
    document = []
    for line in open(data_path, 'r', encoding='utf8'):
        segment = jieba.posseg.cut(line.strip())
        filter_words = []
        stopword = Stop_words()
        for word, flag in segment:
            if flag.startswith('n') is False:
                continue
            if not word in stopword and len(word) > 1:
                filter_words.append(word)
        document.append(filter_words)
    return document


# 代码3-27
# TF-IDF 算法
def  tf_idf():
    # 统计TF值
    tf_dict = {}
    filter_word = Filter_word(text)
    for word in filter_word:
        if word not in tf_dict:
            tf_dict[word] = 1
        else:
            tf_dict[word] += 1
    for word in tf_dict:
        tf_dict[word] = tf_dict[word] / len(text)
    # 统计IDF值
    idf_dict = {}
    document = Filter_words()
    doc_total = len(document)
    for doc in document:
        for word in set(doc):
            if word not in idf_dict:
                idf_dict[word] = 1
            else:
                idf_dict[word] += 1
    for word in idf_dict:
        idf_dict[word] = math.log(doc_total / (idf_dict[word] + 1))
    # 计算TF-IDF值
    tf_idf_dict = {}
    for word in filter_word:
        if word not in idf_dict:
            idf_dict[word] = 0
        tf_idf_dict[word] = tf_dict[word] * idf_dict[word]
    # 提取前10个关键词
    keyword = 10
    print('TF-IDF模型结果：')
    for key, value in sorted(tf_idf_dict.items(), key=operator.itemgetter(1),
                             reverse=True)[:keyword]:
        print(key + '/', end='')


# 代码3-28
tf_idf()
